package com.fitness.util;


import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;



public class DateUtil {
	
	public final static int SECOND=1000;
	public final static int MINUTE=60*SECOND;
	public final static int HOUR=60*MINUTE;
	public final static int DAY=24*HOUR;
	/**
	 * 无符号长时间型yyyyMMddHHmmss
	 */
    public final static String TFORMATE_LONG = "yyyyMMddHHmmss";
	/**
	 * 短横线连接时间 yyyy-MM-dd HH:mm:ss
	 */
    public final static String TFORMATE_SHORTLINE = "yyyy-MM-dd HH:mm:ss";
    
    /**
	 * 斜线连接时间 yyyy/MM/dd HH:mm:ss
	 */
    public final static String TFORMATE_SLASH = "yyyy/MM/dd HH:mm:ss";
    
    /**
	 * 斜线连接日期 yyyy-MM-dd
	 */
    public final static String TFORMATE_SHORTLINE_OUT = "yyyy-MM-dd";
    
    /**
	 * 斜线连接日期 yyyy/MM/dd
	 */
    public final static String TFORMATE_SLASH_OUT = "yyyy/MM/dd";
    
	

	
	

	/**
	 * 获取当前的时间 yyyy-MM-dd HH:mm:ss
	 * @return
	 */
	public static String getCurrentTime(){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String str =  sdf.format(new Date());
		return str;
	}
	/**
	 * 获取当前的时间yyyy-MM-dd
	 * @return
	 */
	public static String getCurrentTimeTwo(){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		String str =  sdf.format(new Date());
		return str;
	}
	
	/**
	 * 获取当前的时间HH:mm:ss
	 * @return
	 */
	public static String getCurrentTimeThree(){
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
		String str =  sdf.format(new Date());
		return str;
	}
	/**
	 * 获取当前的时间戳
	 */
	public static Long getTimeStramp(){
		Long timeStamp =  System.currentTimeMillis()/1000;
		return timeStamp;
	}
	/**
	 * 
	 * @param time
	 * @return
	 */
	public static String subTime(String time) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Long timew = null;
		try {
			Date date =  sdf.parse(time);
			long now = new Date().getTime();
			long out =  date.getTime();
			timew = (out-now)/1000;
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return timew.toString();
	}

	/**
	 * 增加时间
	 * @param time
	 * @param minute
	 * @return
	 */
	public static String addTime(String time,int minute) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String result ="";
		try {
			Date date =  sdf.parse(time);
			long off =  date.getTime()+minute*60*1000;
			result =  sdf.format(new Date(off));
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return result;
	}

	/**
	 * now-time
	 * @param time
	 * @return 秒数
	 */
	public static int countTime(String time) {
		return countTime(time,getCurrentTime(),SECOND);
	}
	/**
	 * 计算时间间隔 time2-time1 默认返回秒数
	 * @param time
	 * @param minute
	 * @return
	 */
	public static int countTime(String time1,String time2) {
		return countTime(time1, time2,SECOND);
	}
	
	/**
	 * 计算time2-time1 的时间间隔
	 * @param time1  第一个时间
	 * @param time2 第二个时间
	 * @param timeSort 间隔类型
	 * @return
	 */
	public static int countTime(String time1,String time2,int timeSort) {
		SimpleDateFormat sdf=timeFormate(time1);
		int result = 0;
		try {
			Date date1 =  sdf.parse(time1);
			Date date2 =  sdf.parse(time2);
			//计算两个时间的间隔的天数
			result = new Long((date2.getTime()-date1.getTime())/timeSort).intValue();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return result;
	}

	//时间格式的处理
	public static SimpleDateFormat timeFormate(String time){
		SimpleDateFormat sdf=null;
		if(time.contains(":")){
			if(time.contains("-")) sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//mysql数据库默认格式
			if(time.contains("/")) sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		}else {
			if(time.contains("-")) sdf = new SimpleDateFormat("yyyy-MM-dd");//mysql数据库默认格式
			if(time.contains("/")) sdf = new SimpleDateFormat("yyyy/MM/dd");
		}
		return sdf; 
	}
	
	
	/**
	 *  把微信传过来的长字符串时间字符串转换为yyyy-MM-dd HH:mm:ss
	 * @param format 日期的格式 例如：yyyy-MM-dd HH:mm:ss
	 * @param date string类型的时间字符串
	 * @return
	 * @throws ParseException 
	 */
	public static String formatString(String date){
		SimpleDateFormat simpleDateFormat = createFormate(DateUtil.TFORMATE_LONG);
		SimpleDateFormat simpleDateFormat2 = createFormate(DateUtil.TFORMATE_SHORTLINE);
		Date parse = null;
		String format = "";
		try {
			parse = simpleDateFormat.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		if(parse!=null) format =  simpleDateFormat2.format(parse);
		return format;
	}
	
	
	/**
	 *  把制定时间字符串转换为秒值进行减
	 * @param format 日期格式
	 * @param date   字符串日期
	 * @param second 秒数
	 * @return
	 */
	public static String formatString2(String format,String date,Integer second) {
		
		//设置日期格式
		SimpleDateFormat dateFormat = new SimpleDateFormat(format);

		try {
			//格式化后的日期
			Date parse= dateFormat.parse(date);
			//拿到日期的秒数
			long time = parse.getTime()/1000;
			//日期的秒数减去传入的秒数
			Long resultTime = time+second;
			//拿到结果的秒数转换为日期字符串
			String timeStamp2Date = timeStamp2Date(resultTime.toString(), format);
			return timeStamp2Date;
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
		
	}
	
	
	
	/** 
     *  时间戳转换成日期格式字符串 
     * @param seconds 精确到秒的字符串 
     * @param formatStr 
     * @return 
     */  
    public static String timeStamp2Date(String seconds,String format) {  
        if(seconds == null || seconds.isEmpty() || seconds.equals("null")){  
            return "";  
  }  
        if(format == null || format.isEmpty()){
            format = "yyyy-MM-dd HH:mm:ss";
        }   
        SimpleDateFormat sdf = new SimpleDateFormat(format);  
        return sdf.format(new Date(Long.valueOf(seconds+"000")));  
    }  
    
    /**
     * 将现在的时间转为长字符串 主要用于wx
     * @return
     */
    public static String longTimeStrNow(){
    	return createFormate(TFORMATE_LONG).format(new Date());
    }
    
    /**
     * 在现在时间的基础上进行加减秒数的操作 并返回长的时间字符串
     * @param args
     */
    public static String countLongTimeStr(Integer second){
    	return countLongTimeStr(getTimeStramp(),second);
    }
    
    /**
     * 对String类型进行长字符串的加减转换
     * @param date
     * @param second
     * @return
     */
    public static String countLongTimeStr(String date,Integer second) {
    	Date time =null;
    	try {
    		time = timeFormate(date).parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
    	if(time==null) return "";
    	return countLongTimeStr(time,second);
    }
    
    /**
     * 
     * @param date 时间类型
     * @param second 秒数
     * @return
     */
    public static String countLongTimeStr(Date date,Integer second) {
    	return countLongTimeStr(date.getTime()/1000,second);
    }
    
    /**
     * Long 为时间戳
     * @param date
     * @param second
     * @return
     */
    public static String countLongTimeStr(Long timeSteamp,Integer second) {
    	Long aimTime =  timeSteamp+second;//将时间计算到目标时间
    	SimpleDateFormat sdf = createFormate(TFORMATE_LONG);
    	return sdf.format(new Date(aimTime*1000));
    }
    
    /**
     * 固定格式的时间yyyy-MM-dd HH:mm:ss,订单结束时间 减去开始时间 得到相差的分钟数
     * @param startDate 开始时间
     * @param endData 结束时间
     * @return
     */
    public static Long countStringDate(String startDate,String endData){
    	DateFormat dateFormat = new SimpleDateFormat(DateUtil.TFORMATE_SHORTLINE);
    	 Date sDate = null;
    	 Date eDate = null;
		try {
			sDate = dateFormat.parse(startDate);
			eDate = dateFormat.parse(endData);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	Calendar sCalendar = Calendar.getInstance();
    	Calendar eCalendar = Calendar.getInstance();
    	sCalendar.setTime(sDate);
    	eCalendar.setTime(eDate);
    	Long result = (eCalendar.getTimeInMillis()-sCalendar.getTimeInMillis())/10000;
    	return result;
    }
   
	
   /**
    * 最终会为一个编译类型的工厂类
    * @param formate
    * @return
    */
    public static SimpleDateFormat createFormate(String formate) {
    	SimpleDateFormat sdf = new SimpleDateFormat(formate);
    	return sdf;
    }
    
    /**
     * 获取固定格式时间
     */
    public static Date getDate() {
    	SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	Date date=new Date();
    	sdf.format(date);
    	return date;
    }

    /**
     * 比较时间大小
     * @return
     * @throws ParseException 
     */
    public static Boolean dateCompare(String a,String b) throws ParseException {
    	  DateFormat df = new SimpleDateFormat("HH:mm:ss");//创建日期转换对象HH:mm:ss为时分秒，年月日为yyyy-MM-dd  
    	  
              Date dt1 = df.parse(a);//将字符串转换为date类型  
              Date dt2 = df.parse(b);  
              if(dt1.getTime()<dt2.getTime())//比较时间大小,如果dt1小于dt2  
              {  
                 return true;
              }  
              else  
              {  
                 return false;
              }  
    }
    
    /**
     * string转date
     */
    public static Date string2Date(String string){
    			Date date2 = new Date();
    		   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    		try {
				  date2 = sdf.parse(string);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    		return date2;
    }
    /**
     * 获取当前的年份
     * @return
     */
    public static String getCurrentYear(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        Date date = new Date();
        return sdf.format(date);
}
    /**
     * 时间大小对比
     * @param time1
     * @param time2
     * @return
     * @throws ParseException
     */
    public static boolean compare(String time1,String time2) throws ParseException  
    {  
        //如果想比较日期则写成"yyyy-MM-dd"就可以了  
        SimpleDateFormat sdf=new SimpleDateFormat("hh:mm:ss");  
        //将字符串形式的时间转化为Date类型的时间  
        Date a=sdf.parse(time1);  
        Date b=sdf.parse(time2);  
        //Date类的一个方法，如果a早于b返回true，否则返回false  
        if(a.before(b))  
            return true;  
        else  
            return false;  
        /* 
         * 如果你不喜欢用上面这个太流氓的方法，也可以根据将Date转换成毫秒 
        if(a.getTime()-b.getTime()<0) 
            return true; 
        else 
            return false; 
        */  
    }  
    /**
     * 输入年份月份返回天数
     * @param year
     * @param month
     * @return
     */
    public static int getDays(int year, int month) {  
    	int days = 0;  
    	boolean isLeapYear = false;  
    	if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {  
    	isLeapYear = true;  
    	} else {  
    	isLeapYear = false;  
    	}  
    	switch (month) {  
    	case 1:  
    	case 3:  
    	case 5:  
    	case 7:  
    	case 8:  
    	case 10:  
    	case 12:  
    	days = 31;  
    	break;  
    	case 2:  
    	if (isLeapYear) {  
    	days = 29;  
    	} else {  
    	days = 28;  
    	}  
    	break;  
    	case 4:  
    	case 6:  
    	case 9:  
    	case 11:  
    	days = 30;  
    	break;  
    	default:  
    	System.out.println("error!!!");  
    	break;  
    	}  
    	return days;  
    	}  
}
